package com.joven.dao;

import java.io.Serializable;
import java.util.Iterator;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;

import com.joven.model.Page;

/**
 * 本单元为准备实现的接口
 * @author joven
 *
 */
public interface JvDAO {
	    //根据主键类型的id获取实体对象,立即执行查询返回对象,数据库没有匹配则返回null
		public <T> T findById(Class<T> entityClass,Serializable id);
		
		//根据hql语句取实体对象，没匹配记录时返回null
		public <T> T findBySQL(String hql,Object... values);
		
		//根据传进DTO对象查询，没匹配记录时返回null
		public <T> T findByDTO(T t);
		
		//获取实体类型的全部对象
		public <T> List<T> findAll(Class<T> entityClass);
		
		//根据传进DTO对象查询，可指定like查询字段,没匹配记录时返回null
		public <T> T findAllByDTO(T t,String... likeProps);
		
		//删除对象
		public <T> void delete(T obj);
		
		//根据id删除对象
		public <T> void deleteById(Class<T> entityClass,Serializable id);
		
	    //保存对象
	    public void save(Object obj);
	    
	    //保存对象，如果对象已经存在则更新
	    public void saveOrUpdate(Object obj);

	    //更新对象
	    public void update(Object obj);
	    
	    //按hql查询，返回指定整型的结果,条件不存在时返回0
	    public int getNum(String hql, Object... values);
	    
	    //指定条件记录是否存在
	    public boolean isExists(String hql, Object... values);
	    
		//返回iterator接口类型的结果
		public <T> Iterator<T> iterator(String hql,Object...values);
		
		// @return 当前上下文的原生Hibernate session对象,依然受到spring事务管理不需要手动close
		public Session getNativeHibernateSession();
		
		//创建Query对象,对于需要first,max,fetchsize,cache,cacheRegion等诸多设置的函数,可以在返回Query后自行设置.
		public Query createQuery(String hql);
		public Query createQuery(String hql,Object... values);
		
		//直接执行hsql语句,返回影响行数
		public int executeUpdate(String hql);
		public int executeUpdate(String hql,Object... values);
		

		//分页查询
		public <T> Page<T> getPages(int pageNo, int pageSize,String hql, Object... values);
		//分页查询,已经有总记录数的情况
		public <T> Page<T> getPages(int totalCount, int pageNo, int pageSize,String hql, Object... values);
		
		//初始化数据
		public void initialize(Object proxy);
		
		//执行一些必须的sql语句把内存中的对象同步到数据库中
		public void flush();
	    
		// 清除对象缓存
		public void clear();
		
		
//	public List<T> findByCriteria(Map map);
//	/**
//	 * 查询
//	 * 
//	 * @return
//	 */
//	List<T> findAll();
//
//	/**
//	 * 查询
//	 * 
//	 * @param hql
//	 * @param params
//	 * @return
//	 */
//	List<T> findList(String hql, Object... params);
//
//	/**
//	 * 查找Entity
//	 * 
//	 * @param id
//	 *            主键
//	 * @return T
//	 */
//	T findById(Pk id);
//	void deleteById(Pk id);
//	/**
//	 * 
//	 * 
//	 * @param entity
//	 *        
//	 */
//	void addEntity(T entity);
//
//	/**
//	 * 
//	 * 
//	 * @param entities
//	 */
//	void addEntityes(List<T> entities);
//
//    /**
//     * 按keys指定的字段名及对应values指定的值来查询数据库
//     * @param keys ： 一个或多个以And分隔的字段名，如name, nameAndDepartmentId
//     * @param values : 值列表，需要跟keys的个数匹配
//     * @return List<T>
//     *
//     * examples :
//     *      findAllBy("name", "kramer");
//     *      findAllBy("nameAndDepartmentId", "kramer", "2");
//     */
//    public List<T> findAllBy(String keys, Object... values);
//
//    /**
//     * 按keys指定的字段名及对应values指定的值来查询数据库中符合条件的第一个记录
//     * @param keys ： 一个或多个以And分隔的字段名，如name, nameAndDepartmentId
//     * @param values : 值列表，需要跟keys的个数匹配
//     * @return T
//     *
//     * examples :
//     *      findBy("name", "kramer");
//     *      findBy("nameAndDepartmentId", "kramer", "2");
//     */
//    public T findBy(String keys, Object... values);
//
//	/**
//	 * 删除
//	 * 
//	 * @param entity
//	 */
//	void delete(T entity);
//
//	/**
//	 * 删除
//	 * 
//	 * @param entities
//	 */
//	void delete(List<T> entities);
//
//	/**
//	 * 
//	 * 更新
//	 * @param entity
//	 */
//	void update(T entity);
//
//	/**
//	 * 更新
//	 * 
//	 * @param entities
//	 */
//	void update(List<T> entities);
//
//	/**
//	 * 分页
//	 * 
//	 * @param page
//	 * @param rowPerPage
//	 * @return
//	 */
//	PageUtil findForPages(int page, int rowPerPage, String hql);
//	
//	/**
//	  * findReturnPage 方法
//	  * <p>方法说明:分页</p>
//	  * @param hql
//	  * @param countHql
//	  * @param currentPage
//	  * @return
//	  * @return Page<T>
//	  * @author liudonggan Email:ldg123456@sina.com
//	  * @date 2011-9-23 下午03:10:27
//	*/
//	public Page<T> findReturnPage(final String hql, final String countHql,
//			final int currentPage);
//	
//	public Page<T> findReturnPage(final String hql, final String countHql,
//			final int currentPage, final int pageSize);
//
//	public void delEntityByHql(final String hql);
//
//    public Criteria createCriteriaBy(String keys, Object... values);
//
//    public Criteria createCriteria();
//    
//    /**
//     * 查记录数
//     * @param hql
//     * @return
//     */
//    public int findRecCount(final String hql);			
			
}
